package br.fatec.ads.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.fatec.ads.connection.DataSource;
import br.fatec.ads.exception.CandidaturaAgendamentoException;
import br.fatec.ads.exception.CandidaturaException;
import br.fatec.ads.exception.DataBaseException;
import br.fatec.ads.model.Area;
import br.fatec.ads.model.Candidatura;
import br.fatec.ads.model.CandidaturaAgendamento;
import br.fatec.ads.model.ProcessoSeletivo;
import br.fatec.ads.model.TipoAgendamento;
import br.fatec.ads.model.Usuario;
import br.fatec.ads.model.Vaga;

/**
 * Classe intermediaria entre o modelo e o banco de dados 
 */
public class CandidaturaAgendamentoDAO {
	private static CandidaturaAgendamentoDAO candidaturaAgendamentoDAO;
	private static String INCLUIR_CANDIDATO_AGENDAMENTO = "EXEC P_CANDIDATO_AGENDAMENTO_INCLUIR ?, ?, ?, ?";
	private static String ALTERAR_CANDIDATO_AGENDAMENTO = "EXEC P_CANDIDATO_AGENDAMENTO_ALTERAR ?, ?, ?, ?, ?, ?";
	private static String EXCLUIR_CANDIDATO_AGENDAMENTO = "EXEC P_CANDIDATO_AGENDAMENTO_EXCLUIR ?, ?, ?";
	private static String CONSULTAR_CANDIDATO_AGENDAMENTO = "EXEC P_CANDIDATO_AGENDAMENTO_CONSULTAR ?, ?, ?";
	private static String LISTAR_CANDIDATO_AGENDAMENTO = "EXEC P_CANDIDATO_AGENDAMENTO_LISTAR ?, ?, ?";
	
	public CandidaturaAgendamentoDAO() {
		super();
	}
	
	public static CandidaturaAgendamentoDAO getInstance(){
		if(candidaturaAgendamentoDAO == null){
			candidaturaAgendamentoDAO = new CandidaturaAgendamentoDAO();
		}
		
		return candidaturaAgendamentoDAO;
	}
	
    public void incluirCandidaturaAgendamento(CandidaturaAgendamento candidaturaAgendamento) throws CandidaturaAgendamentoException, DataBaseException{
        Connection connection = null;
        PreparedStatement query = null;

        try{
            try{
                connection = DataSource.getConnection();
                query = connection.prepareStatement(INCLUIR_CANDIDATO_AGENDAMENTO);

                int i = 0;
                query.setInt(++i, candidaturaAgendamento.getCandidatura().getIdCandidatura());
                query.setInt(++i, candidaturaAgendamento.getTipoAgendamento().getIdTipoAgendamento());
                query.setString(++i, candidaturaAgendamento.getDescAgendamento());
                query.setString(++i, candidaturaAgendamento.getUsuario());
                
                query.executeUpdate();
            }catch(SQLException cause){
                throw new CandidaturaAgendamentoException("Problemas ao INSERIR a Candidatura Agendamento!", cause);
            }finally{
                DataSource.close(connection);
                DataSource.close(query);
            }
        } catch(DataBaseException cause){
            throw new DataBaseException(cause);
        }
    }
    
    public void alterarCandidaturaAgendamento(CandidaturaAgendamento candidaturaAgendamento) throws CandidaturaAgendamentoException, DataBaseException {
        Connection connection = null;
        PreparedStatement query = null;

        try{
            try{
                connection = DataSource.getConnection();
                query = connection.prepareStatement(ALTERAR_CANDIDATO_AGENDAMENTO);

                int i = 0;
                query.setInt(++i, candidaturaAgendamento.getCandidatura().getIdCandidatura());
                query.setInt(++i, candidaturaAgendamento.getTipoAgendamento().getIdTipoAgendamento());
                query.setInt(++i, candidaturaAgendamento.getIdSequencia());
                query.setString(++i, candidaturaAgendamento.getDescAgendamento());
                query.setString(++i, candidaturaAgendamento.getIndAprovado());
                query.setString(++i, candidaturaAgendamento.getUsuario());
                
                query.executeUpdate();
            }catch(SQLException cause){
                throw new CandidaturaAgendamentoException("Problemas ao ALTERAR a Candidatura Agendamento!", cause);
            }finally{
                DataSource.close(connection);
                DataSource.close(query);
            }
        }catch(DataBaseException cause){
            throw new DataBaseException(cause);
        }
    }
    
    public void excluirCandidaturaAgendamento(CandidaturaAgendamento candidaturaAgendamento) throws CandidaturaAgendamentoException, DataBaseException{
        Connection connection = null;
        PreparedStatement query = null;

        try{
            try{
                connection = DataSource.getConnection();
                query = connection.prepareStatement(EXCLUIR_CANDIDATO_AGENDAMENTO);

                int i = 0;
                query.setInt(++i, candidaturaAgendamento.getCandidatura().getIdCandidatura());
                query.setInt(++i, candidaturaAgendamento.getTipoAgendamento().getIdTipoAgendamento());
                query.setInt(++i, candidaturaAgendamento.getIdSequencia());

                query.executeUpdate();
            }catch(SQLException cause){
                throw new CandidaturaAgendamentoException("Problemas ao EXCLUIR a Candidatura Agendamento!", cause);
            }finally{
                DataSource.close(connection);
                DataSource.close(query);
            }
        }catch(DataBaseException cause){
            throw new DataBaseException(cause);
        }
    }
    
    public CandidaturaAgendamento getCandidaturaAgendamento(CandidaturaAgendamento candidaturaAgendamento) throws CandidaturaAgendamentoException, DataBaseException{
    	Connection connection = null;
    	PreparedStatement query = null;
    	ResultSet resultSet = null;
    	Usuario usuario;
    	Vaga vaga;
    	ProcessoSeletivo processoSeletivo;
    	Candidatura candidato;
    	TipoAgendamento tipoAgendamento;
    	CandidaturaAgendamento candAgend = null;
    	
    	try{
    		try{
    			connection = DataSource.getConnection();
    			query = connection.prepareStatement(CONSULTAR_CANDIDATO_AGENDAMENTO);
    			
    			int i = 0;
    			query.setInt(++i, candidaturaAgendamento.getCandidatura().getIdCandidatura());
    			query.setInt(++i, candidaturaAgendamento.getTipoAgendamento().getIdTipoAgendamento());
    			query.setInt(++i, candidaturaAgendamento.getIdSequencia());
    			
    			resultSet = query.executeQuery();
    			
    			while(resultSet.next()){
    				candAgend = new CandidaturaAgendamento();
    				vaga = new Vaga();
    				usuario = new Usuario();
    				processoSeletivo = new ProcessoSeletivo();
    				candidato = new Candidatura();
    				tipoAgendamento = new TipoAgendamento();
    				
    				usuario.setNomeUsuario(resultSet.getString("NOMEUSUARIO"));
    				
    				processoSeletivo.setNomeProcessoSeletivo(resultSet.getString("NOMEPROCESSOSELETIVO"));
    				
    				vaga.setProcessoSeletivo(processoSeletivo);
    				vaga.setCargoVaga(resultSet.getString("CARGOVAGA"));
    				
    				candidato.setVaga(vaga);
    				candidato.setIdUsuario(usuario);
    				candidato.setIdCandidatura(resultSet.getInt("IDCANDIDATURA"));
    				
    				tipoAgendamento.setDescTipoAgendamento(resultSet.getString("DESCTIPOAGENDAMENTO"));
    				tipoAgendamento.setIdTipoAgendamento(resultSet.getInt("IDTIPOAGENDAMENTO"));
    				
    				candAgend.setCandidatura(candidato);
    				candAgend.setTipoAgendamento(tipoAgendamento);
    				candAgend.setIdSequencia(resultSet.getInt("IDSEQUENCIA"));
    				candAgend.setDescAgendamento(resultSet.getString("DESCAGENDAMENTO"));
    				candAgend.setIndAprovado(resultSet.getString("INDAPROVADO"));
    				candAgend.setUsuario(resultSet.getString("USUARIOINCLUSAO"));
    				candAgend.setDataHora(resultSet.getTimestamp("DTHRINCLUSAO"));
    			}
    		}catch (SQLException cause) {
    			throw new CandidaturaAgendamentoException("Problemas ao CONSULTAR a Candidatura x Agendamento!", cause);
			}finally{
				DataSource.close(connection);
				DataSource.close(query);
				DataSource.close(resultSet);
			}
    	}catch (DataBaseException cause) {
    		throw new DataBaseException(cause);
		}
    	return candAgend;
    }

    public List listarCandidaturaAgendamento(CandidaturaAgendamento candidaturaAgendamento) throws CandidaturaAgendamentoException, DataBaseException{
    	Connection connection = null;
    	PreparedStatement query = null;
    	ResultSet resultSet = null;
    	List listaCandidaturaAgendamento = new ArrayList();
    	
    	try{
    		try{
    			connection = DataSource.getConnection();
    			query = connection.prepareStatement(LISTAR_CANDIDATO_AGENDAMENTO);
    			
    			int i = 0;
    			query.setInt(++i, candidaturaAgendamento.getCandidatura().getVaga().getIdVaga());
    			query.setInt(++i, candidaturaAgendamento.getTipoAgendamento().getIdTipoAgendamento());
    			query.setString(++i, candidaturaAgendamento.getCandidatura().getIdUsuario().getNomeUsuario());
    			
    			resultSet = query.executeQuery();
    			
    			while(resultSet.next()){
    				CandidaturaAgendamento candAgend = new CandidaturaAgendamento();
    				Vaga vaga = new Vaga();
    				Usuario usuario = new Usuario();
    				ProcessoSeletivo processoSeletivo = new ProcessoSeletivo();
    				Candidatura candidato = new Candidatura();
    				TipoAgendamento tipoAgendamento = new TipoAgendamento();
    				
    				usuario.setNomeUsuario(resultSet.getString("NOMEUSUARIO"));
    				
    				processoSeletivo.setNomeProcessoSeletivo(resultSet.getString("NOMEPROCESSOSELETIVO"));
    				
    				vaga.setProcessoSeletivo(processoSeletivo);
    				vaga.setCargoVaga(resultSet.getString("CARGOVAGA"));
    				
    				candidato.setVaga(vaga);
    				candidato.setIdUsuario(usuario);
    				candidato.setIdCandidatura(resultSet.getInt("IDCANDIDATURA"));
    				
    				tipoAgendamento.setDescTipoAgendamento(resultSet.getString("DESCTIPOAGENDAMENTO"));
    				tipoAgendamento.setIdTipoAgendamento(resultSet.getInt("IDTIPOAGENDAMENTO"));
    				
    				candAgend.setCandidatura(candidato);
    				candAgend.setTipoAgendamento(tipoAgendamento);
    				candAgend.setIdSequencia(resultSet.getInt("IDSEQUENCIA"));
    				candAgend.setDescAgendamento(resultSet.getString("DESCAGENDAMENTO"));
    				candAgend.setIndAprovado(resultSet.getString("INDAPROVADO"));
    				candAgend.setUsuario(resultSet.getString("USUARIOINCLUSAO"));
    				candAgend.setDataHora(resultSet.getTimestamp("DTHRINCLUSAO"));
    				
    				listaCandidaturaAgendamento.add(candAgend);
    			}
    		}catch (SQLException cause) {
    			throw new CandidaturaAgendamentoException("Problemas ao LISTAR a Candidatura Agendamento!", cause);
			}finally{
				DataSource.close(connection);
				DataSource.close(query);
				DataSource.close(resultSet);
			}
    	}catch (DataBaseException cause) {
    		throw new DataBaseException(cause);
		}
    	
    	return listaCandidaturaAgendamento;
    }
}